package negocio;

import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.Iterator;
import java.util.List;

import dao.CampaniaDAO;
import dao.TraficoNumCortoDAO;
import entity.CampaniaBD;
import fachade.EmpresaFachade;
import fachade.PrincipalFachade;

public class Comprobante {
	
	
	private Integer  numComprobante;
	private Empresa Cliente;
	private Date fechaEmision;
	private Date fechaDesde = null;
	private Date fechaHasta = null;
	private String cae;
	private List<ItemComprobante> itemsComprobante;
	private String observaciones;
	private String tipo_comprobante;
	
	public Comprobante(){}
	
	public Comprobante(Integer numComprobante, Empresa cliente,
			Date fechaEmision, Date fechaDesde, Date fechaHasta, String cae,
			List<ItemComprobante> itemsComprobante) {
		super();
		this.numComprobante = numComprobante;
		Cliente = cliente;
		this.fechaEmision = fechaEmision;
		this.fechaDesde = fechaDesde;
		this.fechaHasta = fechaHasta;
		this.cae = cae;
		this.setItemsComprobante(itemsComprobante);
	}
	
	public Integer getNumComprobante() {
		return numComprobante;
	}
	public void setNumComprobante(Integer numComprobante) {
		this.numComprobante = numComprobante;
	}
	public Empresa getCliente() {
		return Cliente;
	}
	public void setCliente(Empresa cliente) {
		Cliente = cliente;
	}
	public Date getFechaEmision() {
		return fechaEmision;
	}
	public void setFechaEmision(Date fechaEmision) {
		this.fechaEmision = fechaEmision;
	}
//	public Date getFechaDesde() {
//		return fechaDesde;
//	}
//	public void setFechaDesde(Date fechaDesde) {
//		this.fechaDesde = fechaDesde;
//	}
//	public Date getFechaHasta() {
//		return fechaHasta;
//	}
//	public void setFechaHasta(Date fechaHasta) {
//		this.fechaHasta = fechaHasta;
//	}
	public String getCae() {
		return cae;
	}
	public void setCae(String cae) {
		this.cae = cae;
	}


	public List<ItemComprobante> getItemsComprobante() {
		return itemsComprobante;
	}


	public void setItemsComprobante(List<ItemComprobante> itemsComprobante) {
		this.itemsComprobante = itemsComprobante;
	}

	public String getObservaciones() {
		return this.observaciones;
	}
	
	public void setObservaciones(String texto) {
		this.observaciones = texto;
	}
	
	public String getTipoComprobante() {
		return this.tipo_comprobante;
	}

	public void setTipo(String tipo_comprobante) {
		this.tipo_comprobante = tipo_comprobante;
	}
	
	
	public void generarComprobantes(Empresa e, boolean incluirConceptosAdicionales) throws Exception{
		DateFormat df = new SimpleDateFormat("yyyyMM");
		String sPer= df.format(this.fechaDesde);
		int periodo=Integer.valueOf(String.valueOf(Integer.parseInt(sPer)));
		
		CampaniaDAO dao = new CampaniaDAO();
		TraficoNumCortoDAO daoC= new TraficoNumCortoDAO();
		EmpresaFachade t=new EmpresaFachade();
		if(t.getEmpresaBDyId(e.getCodigoEmpresa()).getTipo_empresa().equalsIgnoreCase("Carrier") )
			e=new Carrier(t.getEmpresaBDyId(e.getCodigoEmpresa()));
		//este metodo debe traer las campanias a facturar del period ingresado asociadas al cliente/carrier para luego traer el trafico asociado a las mismas
		//verificar que las campanias no se encuentren facturadas para el periodo ingresado

		List<Campania> lista = new ArrayList<Campania>();
		
		if(e instanceof Cliente){
			List<CampaniaBD> campanias = dao.getCampaniasClientePeriodo(e, periodo);
			if(campanias != null)
				lista=PrincipalFachade.getInstance().toNegocio(campanias);	
		}else{
			List<CampaniaBD> campanias = daoC.getCampaniasCarrier(e.getCodigoEmpresa(), periodo);
			if(campanias != null)
				lista=PrincipalFachade.getInstance().toNegocio(campanias);
		}

		List<ItemComprobante> listaItem = null;
		if(lista != null){
			listaItem= new ArrayList<ItemComprobante>();
		}
		//este metodo debe ir a buscar el trafico asociado a las campanias para el periodo indicado.
		//Por cada campania, va a traer los registros de trafico asociados y generar los ItemComprobantes (campania.generaritems)
		//Si es cliente traer todo el trafico con campania.Empresa= emp y fecha en periodo
		//Si es carrier traer todo el trafico con concepto.carrier= emp y fecha en periodo
		
		for(int i=0;i<lista.size();i++){
			listaItem.addAll(lista.get(i).getItemsAFacturar(e, periodo,incluirConceptosAdicionales));
		}

		/* DEBUG:
		for(int i=0;i<listaItem.size();i++){
			System.out.println(listaItem.get(0).toString());
		}*/
		
		this.itemsComprobante = listaItem;		
	}
	
	public Float getImporteTotalComprobante() {
		float tmpTotal = 0F;
		
		for (Iterator iterator = this.getItemsComprobante().iterator(); iterator.hasNext();) {
			ItemComprobante item = (ItemComprobante) iterator.next();
			tmpTotal += item.getPrecioUnitario() * item.getCantidad();
		}
		return tmpTotal;
	}
	
	public Date setFechaHasta() {
		
		//prueba
		DateFormat df = new SimpleDateFormat("yyyyMM");
		String sPer= df.format(this.fechaDesde);
		int year = Integer.valueOf(String.valueOf(Integer.parseInt(sPer)).substring(0, 4));
//		supongo que aca es -a porque arranca de cero el mes !!!!!!!!
		int month = Integer.valueOf(String.valueOf(Integer.parseInt(sPer)).substring(4, 6));
		int day = 1;
		
//		int year = this.fechaDesde.getYear();
//		int month = this.fechaDesde.getMonth();
//		int day = this.fechaDesde.getDay();
//		
		Calendar calendar = Calendar.getInstance();
		calendar.setTime(fechaDesde);
		day =  calendar.getActualMaximum(calendar.DAY_OF_MONTH);
		
		
		  SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy");
		  Date d;
		try {
			//pero aca no arranca de cero!!!!!!!!!
			this.fechaHasta = sdf.parse(String.valueOf(day)+"/"+String.valueOf(month)+"/"+String.valueOf(year));
			} catch (ParseException e) {
			e.printStackTrace();
		}
		return this.fechaHasta;
	}

	public void setFechaDesde(String periodoFacturacion) {
		
		
		Calendar calendar = Calendar.getInstance();
		  int year = Integer.valueOf(periodoFacturacion.substring(3,7));
		  int month = Integer.valueOf(periodoFacturacion.substring(0,2));
		  //este cambio hay que probarlo bien
//		  int month = Integer.valueOf(periodoSeleccionado.substring(0,2));
		  int date = 1;
		  calendar.set(year, month, date);
//		 this.fechaDesde = new Date(year, month, 1);
		
		  SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy");
//		  Date d;
		try {
			this.fechaDesde = sdf.parse(String.valueOf(date)+"/"+String.valueOf(month)+"/"+String.valueOf(year));
			} catch (ParseException e) {
			e.printStackTrace();
		}
		 
		
//		DateFormat df = new SimpleDateFormat("yyyyMM");
//		String sPer= df.format(this.fechaDesde);
//		int year = Integer.valueOf(String.valueOf(-190000+Integer.parseInt(sPer)).substring(0, 4));
//		int month = Integer.valueOf(String.valueOf(-190000+Integer.parseInt(sPer)).substring(4, 6));
//		int date = 1;
//		
//		  SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy");
//		  Date d;
//		try {
//			this.fechaDesde = sdf.parse(String.valueOf(date)+"/"+String.valueOf(month)+"/"+String.valueOf(year));
//			} catch (ParseException e) {
//			e.printStackTrace();
//		}
//		return this.fechaDesde;
	}

	public Date getFechaDesde() {
		return this.fechaDesde;
	}

	public Date getFechaHasta() {
		return this.fechaHasta;
	}

}
